home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / disk / cdrom / MusicBox-2.1os.lha / MusicBox / Archive.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-29  |  32.4 KB  |  1,374 lines

  1. /*
  2.  ##########################################################################
  3.  ####                                                                  ####
  4.  ####                        The MusicBox Project                      ####
  5.  ####                    ============================                  ####
  6.  ####                                                                  ####
  7.  #### Archive.c                                                        ####
  8.  ####                                                                  ####
  9.  #### Version 2.1os  --  September 29, 2000                            ####
  10.  ####                                                                  ####
  11.  #### Copyright (C) 1994  Thomas Dreibholz                             ####
  12.  ####               2000  Molbachweg 7                                 ####
  13.  ####                     51674 Wiehl                                  ####
  14.  ####                     Germany                                      ####
  15.  ####                                                                  ####
  16.  ####                     EMail: Dreibholz@bigfoot.com                 ####
  17.  ####                     WWW:   http://www.bigfoot.com/~dreibholz     ####
  18.  ####                                                                  ####
  19.  ##########################################################################
  20. */
  21. /***************************************************************************
  22.  *                                                                         *
  23.  *   This program is free software; you can redistribute it and/or modify  *
  24.  *   it under the terms of the GNU General Public License as published by  *
  25.  *   the Free Software Foundation; either version 2 of the License, or     *
  26.  *   (at your option) any later version.                                   *
  27.  *                                                                         *
  28.  ***************************************************************************/
  29.  
  30. /* MusicBoxArchive Hauptprogramm */
  31.  
  32. #include "Archive.h"
  33. #include "MusicBox.h"
  34. #include "MusicBoxLibrary.h"
  35.  
  36. struct Library        *GfxBase;
  37. extern struct Library *IconBase;
  38. struct Library        *WorkbenchBase;
  39. struct Library        *DiskfontBase;
  40. struct IntuitionBase  *IntuitionBase;
  41. struct Library        *GadToolsBase;
  42. struct Library        *LocaleBase;
  43. struct Library        *MusicBoxBase;
  44. struct Library        *AmigaGuideBase;
  45.  
  46. extern struct TextAttr    topaz11;
  47. extern struct WBenchMsg  *WBenchMsg;
  48. extern struct Menu       *KatalogMenus;
  49. extern struct Window     *KatalogWnd;
  50. extern struct Screen     *Scr;
  51. extern struct TextFont   *Font;
  52. extern struct DiskObject  AudioCD;
  53. extern struct DiskObject  MBArchiv;
  54. extern struct Gadget     *KatalogGadgets[4];
  55.  
  56. struct RastPort       *RPort;
  57. struct MsgPort        *AppPort;
  58. struct MsgPort        *ControlPort;
  59. struct AppItem        *AppItem;
  60. struct AppIcon        *AppIcon;
  61. struct List            Liste1,Liste2;
  62. struct Remember       *CatRemember=NULL,
  63.                       *TitelRemember=NULL;
  64. struct TextFont       *DisplayFont,
  65.                       *TimesFont;
  66. struct Katalog        *Katalog;
  67. struct Locale         *Locale;
  68. struct Catalog        *Catalog;
  69.  
  70. struct Katalog        *AuswahlK=NULL;
  71. UWORD                  AuswahlN=0,AuswahlT=0;
  72. ULONG                  Discs=0,Titel=0,Stds=0,Mins=0,Seks=0,Frames=0;
  73. ULONG                  ControlSignalMask,
  74.                        IDCMPSignalMask,
  75.                        AppSignalMask;
  76.  
  77. UWORD  ArgTitel=0;
  78. UWORD  ArgKNum=0xFFFF;
  79. ULONG  ArgID=0;
  80.  
  81. UWORD  ox,oy;
  82. UBYTE *VerStr=VERSTR;
  83. UBYTE  ASave=1;
  84. UBYTE  zero=0;
  85.  
  86. BOOL   LowRes=FALSE;
  87. BOOL   USModus=FALSE;
  88. BOOL   Quiet=FALSE;
  89. BOOL   NoReq=FALSE;
  90. BOOL   NoTT=FALSE;
  91. BOOL   FastExit=FALSE;
  92.  
  93. struct TextAttr DisplayAttr={"hifi-display.font",18,FS_NORMAL,FPF_DISKFONT};
  94. struct TextAttr TimesAttr={"times.font",18,FS_NORMAL,FPF_DISKFONT};
  95.  
  96. void Find();
  97. LONG MultiRequest();
  98. void Error();
  99. int  ControlHandler();
  100. void Iconify();
  101. void LadeKataloge();
  102. void KatalogeSichern();
  103. void ZeigePrefs();
  104. void PrefsLaden();
  105. void Liste1Clicked();
  106. void Liste2Clicked();
  107. void ZeigeLogo();
  108.  
  109. void PutText(x,y,text)
  110.  int     x,y;
  111.  UBYTE *text;
  112. {
  113.  if(LowRes==TRUE) y-=35;
  114.  PutTextA(KatalogWnd,x,y,text);
  115. }
  116.  
  117. void PutMText2(x,y,text,l)
  118.  int     x,y;
  119.  UBYTE *text;
  120.  int     l;
  121. {
  122.  if(LowRes==TRUE) y-=35;
  123.  PutMText(KatalogWnd,x,y,text,l);
  124. }
  125.  
  126. UBYTE *GS(num,def)
  127.  LONG   num;
  128.  UBYTE *def;
  129. {
  130.  if(Catalog==NULL) return(def);
  131.  return(GetCatalogStr(Catalog,num,def));
  132. }
  133.  
  134. void CloseAll()
  135. {
  136.  CloseKatalogWindow();
  137.  CloseDownScreen();
  138.  EntferneIcon();
  139.  if(AppPort) DeletePortA(AppPort);
  140.  if(ControlPort) DeleteMMPort(ControlPort);
  141.  if(TitelRemember) FreeRemember(TitelRemember,TRUE);
  142.  if(CatRemember) FreeRemember(CatRemember,TRUE);
  143.  if(DisplayFont) CloseFont(DisplayFont);
  144.  if(TimesFont) CloseFont(TimesFont);
  145.  if(LocaleBase)
  146.   {
  147.    if(Catalog) CloseCatalog(Catalog);
  148.    if(Locale) CloseLocale(Locale);
  149.    CloseLibrary(LocaleBase);
  150.   }
  151.  if(GfxBase) CloseLibrary(GfxBase);
  152.  if(IntuitionBase) CloseLibrary(IntuitionBase);
  153.  if(IconBase) CloseLibrary(IconBase);
  154.  if(MusicBoxBase) CloseLibrary(MusicBoxBase);
  155.  if(AmigaGuideBase) CloseLibrary(AmigaGuideBase);
  156.  if(WorkbenchBase) CloseLibrary(WorkbenchBase);
  157.  if(DiskfontBase) CloseLibrary(DiskfontBase);
  158.  if(GadToolsBase) CloseLibrary(GadToolsBase);
  159.  exit(0);
  160. }
  161.  
  162. void OpenAll()
  163. {
  164.  register int   test;
  165.  struct TagItem tag[2];
  166.  
  167.  if(USModus==FALSE)
  168.   {
  169.    LocaleBase=OpenLibrary("locale.library",38L);
  170.    if(LocaleBase!=NULL)
  171.     {
  172.      Locale=OpenLocale(NULL);
  173.      if(Locale!=NULL)
  174.        Catalog=OpenCatalogA(Locale,"musicbox.catalog",NULL);
  175.     }
  176.   }
  177.  GfxBase=OpenLibrary("graphics.library",37L);
  178.  IntuitionBase=OpenLibrary("intuition.library",37L);
  179.  if((GfxBase==NULL)||(IntuitionBase==NULL))
  180.   {
  181.    puts(GS(1,"This program requires Kickstart 2.0, V37!"));
  182.    CloseAll();
  183.   }
  184.  AmigaGuideBase=OpenLibrary("amigaguide.library",0L);
  185.  MusicBoxBase=OpenLibrary("musicbox.library",0L);
  186.  if(MusicBoxBase==NULL)
  187.   {
  188.    Error(GS(55,"Unable to open musicbox.library"));
  189.    CloseAll();
  190.   }
  191.  if((UnIconifyArchive())==0) CloseAll();
  192.  if((LibVersionCheck(VERSION))==0)
  193.    CloseAll();
  194.  IconBase=OpenLibrary("icon.library",0L);
  195.  if(IconBase==NULL)
  196.   {
  197.    Error(GS(2,"Unable to open icon.library!"));
  198.    CloseAll();
  199.   }
  200.  WorkbenchBase=OpenLibrary("workbench.library",37L);
  201.  if(WorkbenchBase==NULL)
  202.   {
  203.    Error(GS(3,"Unable to open workbench.library!"));
  204.    CloseAll();
  205.   }
  206.  GadToolsBase=OpenLibrary("gadtools.library",37L);
  207.  if(GfxBase==NULL)
  208.   {
  209.    Error(GS(4,"Unable to open gadtools.library!"));
  210.    CloseAll();
  211.   }
  212.  DiskfontBase=OpenLibrary("diskfont.library",0L);
  213.  if(GfxBase==NULL)
  214.   {
  215.    Error(GS(5,"Unable to open diskfont.library!"));
  216.    CloseAll();
  217.   }
  218.  AppPort=CreatePortA(0L,0L);
  219.  ControlPort=CreatePortA(ARCHIVE_HOSTNAME,0L);
  220.  if((AppPort==NULL)||(ControlPort==NULL))
  221.   {
  222.    Error(GS(12,"Unable to create a message port"));
  223.    CloseAll();
  224.   }
  225.  AppSignalMask=(1L<<AppPort->mp_SigBit);
  226.  ControlSignalMask=(1L<<ControlPort->mp_SigBit);
  227.  DisplayFont=OpenDiskFont(&DisplayAttr),
  228.  TimesFont=OpenDiskFont(&TimesAttr);
  229.  if(TimesFont==NULL)
  230.   {
  231.    Error(GS(11,"Unable to open font: times.font 18"));
  232.    CloseAll();
  233.   }
  234.  Katalog=AllocRemember(&CatRemember,sizeof(struct Katalog),MEMF_ANY);
  235.  if(Katalog==NULL)
  236.   {
  237.    Error(GS(6,"Not enough memory!"));
  238.    CloseAll();
  239.   }
  240.  test=SetupScreen();
  241.  if(test!=0)
  242.    CloseAll();
  243.  test=InitIcon();
  244.  if(test==FALSE) return;
  245.  NewListA(&Liste1);
  246.  NewListA(&Liste2);
  247.  LadeKataloge();
  248.  PrefsLaden();
  249.  
  250.  if(Quiet==FALSE)
  251.   {
  252.    test=OpenKatalogWindow();
  253.    if(test!=0)
  254.      CloseAll();
  255.   }
  256.  else
  257.   Iconify();
  258.  
  259.  RPort=KatalogWnd->RPort;
  260.  ox=KatalogWnd->BorderLeft;
  261.  oy=KatalogWnd->BorderTop;
  262.  
  263.  ZeigePrefs();
  264.  ZeigeLogo();
  265.  tag[0].ti_Tag=GTLV_Labels;
  266.  tag[0].ti_Data=&Liste2;
  267.  tag[1].ti_Tag=TAG_DONE;
  268.  GTSetGadgetAttrsA(KatalogGadgets[2],KatalogWnd,NULL,&tag);
  269.  if(ArgKNum!=0xFFFF)
  270.   {
  271.    Liste2Clicked(ArgKNum);
  272.    Liste1Clicked(ArgTitel);
  273.    ArgKNum=0xFFFF;
  274.   }
  275. }
  276.  
  277. LONG MultiRequest(titel,text,gads)
  278.  UBYTE *titel,*text,*gads;
  279. {
  280.  struct EasyStruct easy;
  281.  
  282.  easy.es_StructSize=sizeof(struct EasyStruct);
  283.  easy.es_Flags=0;
  284.  easy.es_Title=titel;
  285.  easy.es_TextFormat=text;
  286.  easy.es_GadgetFormat=gads;
  287.  return(EasyRequestArgs(NULL,&easy,0L,0L));
  288. }
  289.  
  290. void Error(text)
  291. {
  292.  if(NoReq==FALSE) MultiRequest(GS(17,"Music Box Archive - Error!"),text,GS(16,"Abort"));
  293. }
  294.  
  295. void ZeigeTitel()
  296. {
  297.  UBYTE                           text[100];
  298.  register struct KatalogEintrag *ke;
  299.  
  300.  SetAPen(RPort,0);
  301.  if(LowRes==FALSE)
  302.    RectFill(RPort,ox + 7, oy + 202, ox+596, oy+240);
  303.  else
  304.    RectFill(RPort,ox + 7, oy + 167, ox+596, oy+205);
  305.  SetAPen(RPort,FARBE);
  306.  if(AuswahlK)
  307.   {
  308.    PutMText2(11,198,&AuswahlK->CDName,560);
  309.    if(AuswahlT!=0)
  310.     {
  311.      ke=&AuswahlK->KE[AuswahlT-1];
  312.      sprintf(&text,"%s    (%d:%02d '%02d)",
  313.                    ke->Titel,
  314.                    ke->TAdresse/75/60,
  315.                    (ke->TAdresse/75) % 60,
  316.                    ke->TAdresse % 75);
  317.      PutMText2(11,219,&text,560);
  318.     }
  319.   }
  320. }
  321.  
  322. void KatalogInformation()
  323. {
  324.  UBYTE             t1[12],t2[12],t3[20];
  325.  struct InfoStruct info;
  326.  
  327.  info.Title=GS(82,"MusicBox Archive - Information");
  328.  info.ProgName=TITEL;
  329.  info.LowRes=LowRes;
  330.  info.Icon=&MBArchiv;
  331.  info.Text[0].LeftEdge=95;
  332.  info.Text[0].TopEdge=85;
  333.  info.Text[0].Flags=ISTF_LEFT;
  334.  info.Text[0].Text=GS(52,"Total archived CDs:");
  335.  
  336.  info.Text[1].LeftEdge=95;
  337.  info.Text[1].TopEdge=100;
  338.  info.Text[1].Flags=ISTF_LEFT;
  339.  info.Text[1].Text=GS(53,"Total titles:");
  340.  
  341.  info.Text[2].LeftEdge=95;
  342.  info.Text[2].TopEdge=115;
  343.  info.Text[2].Flags=ISTF_LEFT;
  344.  info.Text[2].Text=GS(54,"Total playing time:");
  345.  
  346.  sprintf(&t1,"%ld",Discs);
  347.  info.Text[3].LeftEdge=360;
  348.  info.Text[3].TopEdge=85;
  349.  info.Text[3].Flags=ISTF_RIGHT;
  350.  info.Text[3].Text=&t1;
  351.  
  352.  sprintf(&t2,"%ld",Titel);
  353.  info.Text[4].LeftEdge=360;
  354.  info.Text[4].TopEdge=100;
  355.  info.Text[4].Flags=ISTF_RIGHT;
  356.  info.Text[4].Text=&t2;
  357.  
  358.  sprintf(&t3,"%2ld:%02ld:%02ld '%02ld",Stds,Mins,Seks,Frames);
  359.  info.Text[5].LeftEdge=360;
  360.  info.Text[5].TopEdge=115;
  361.  info.Text[5].Flags=ISTF_RIGHT;
  362.  info.Text[5].Text=&t3;
  363.  info.Text[6].LeftEdge=0;
  364.  
  365.  info.RegInfo=NULL;
  366.  
  367.  SleepPointer(KatalogWnd);
  368.  InformationA(&info);
  369.  ClearPointer(KatalogWnd);
  370. }
  371.  
  372. void Liste1Clicked(code)
  373.  UWORD code;
  374. {
  375.  register int                i;
  376.  register struct TNode      *node;
  377.  register struct StringInfo *si;
  378.  
  379.  AuswahlT=code;
  380.  if(code==0) return;
  381.  
  382.  node=Liste2.lh_Head;
  383.  for(i=0;i<code;i++) node=node->Node.ln_Succ;
  384.  
  385.  si=KatalogGadgets[1]->SpecialInfo;
  386.  strcpy(si->Buffer,&AuswahlK->KE[code-1].Titel);
  387.  RefreshGList(KatalogGadgets[1],KatalogWnd,NULL,1L);
  388.  ZeigeTitel();
  389. }
  390.  
  391. void Liste2Clicked(code)
  392.  UWORD code;
  393. {
  394.  register int                i;
  395.  register struct CNode      *node;
  396.  register struct TNode      *n;
  397.  register struct Katalog    *cat;
  398.  register struct StringInfo *si;
  399.  struct TagItem              tag[2];
  400.  
  401.  NewListA(&Liste1);
  402.  node=Liste2.lh_Head;
  403.  for(i=0;i<code;i++) node=node->Node.ln_Succ;
  404.  if(TitelRemember)
  405.   {
  406.    FreeRemember(TitelRemember,TRUE);
  407.    TitelRemember=NULL;
  408.   }
  409.  cat=node->Katalog;
  410.  
  411.  si=KatalogGadgets[3]->SpecialInfo;
  412.  strcpy(si->Buffer,&cat->CDName);
  413.  RefreshGList(KatalogGadgets[3],KatalogWnd,NULL,1L);
  414.  
  415.  n=AllocRemember(&TitelRemember,sizeof(struct TNode),MEMF_ANY|MEMF_CLEAR);
  416.  if(n!=NULL)
  417.   {
  418.    n->Node.ln_Name=&n->Titel,
  419.    sprintf(&n->Titel,"%s:",&cat->CDName);
  420.    AddHead(&Liste1,n);
  421.   }
  422.  else
  423.   {
  424.    Error(GS(6,"Not enough memory!"));
  425.    CloseAll();
  426.   }
  427.  for(i=0;i<cat->Anzahl;i++)
  428.   {
  429.    n=AllocRemember(&TitelRemember,sizeof(struct TNode),MEMF_ANY|MEMF_CLEAR);
  430.    if(n!=NULL)
  431.     {
  432.      n->Node.ln_Name=&n->Titel;
  433.      if(LowRes==FALSE)
  434.        sprintf(&n->Titel,"%02d  %s",i+1,&cat->KE[i].Titel);
  435.      else
  436.        sprintf(&n->Titel,"%02d %s",i+1,&cat->KE[i].Titel);
  437.      AddTail(&Liste1,n);
  438.     }
  439.    else
  440.     {
  441.      Error(GS(6,"Not enough memory!"));
  442.      CloseAll();
  443.     }
  444.   }
  445.  tag[0].ti_Tag=GTLV_Labels;
  446.  tag[0].ti_Data=&Liste1;
  447.  tag[1].ti_Tag=TAG_DONE;
  448.  GTSetGadgetAttrsA(KatalogGadgets[0],KatalogWnd,NULL,&tag);
  449.  si=KatalogGadgets[1]->SpecialInfo;
  450.  strcpy(si->Buffer,"");
  451.  RefreshGList(KatalogGadgets[1],KatalogWnd,NULL,1L);
  452.  AuswahlK=cat;
  453.  AuswahlN=code;
  454.  AuswahlT=0;
  455.  ZeigeTitel();
  456. }
  457.  
  458. void String1Clicked()
  459. {
  460.  register int                i;
  461.  register struct CNode      *node;
  462.  register struct TNode      *n;
  463.  register struct Katalog    *cat;
  464.  register struct StringInfo *si;
  465.  struct TagItem              tag[2];
  466.  
  467.  if(AuswahlK!=NULL)
  468.   {
  469.    if(AuswahlT!=0)
  470.     {
  471.      node=Liste2.lh_Head;
  472.      for(i=0;i<AuswahlN;i++) node=node->Node.ln_Succ;
  473.      cat=node->Katalog;
  474.      si=KatalogGadgets[1]->SpecialInfo;
  475.      strcpy(&cat->KE[AuswahlT-1].Titel,si->Buffer);
  476.      node->Update=1;
  477.      n=Liste1.lh_Head;
  478.      for(i=0;i<AuswahlT;i++) n=n->Node.ln_Succ;
  479.      if(LowRes==FALSE)
  480.        sprintf(&n->Titel,"%02d  %s",AuswahlT,si->Buffer);
  481.      else
  482.        sprintf(&n->Titel,"%02d %s",AuswahlT,si->Buffer);
  483.      tag[0].ti_Tag=GTLV_Labels;
  484.      tag[0].ti_Data=&Liste1;
  485.      tag[1].ti_Tag=TAG_DONE;
  486.      GTSetGadgetAttrsA(KatalogGadgets[0],KatalogWnd,NULL,&tag);
  487.      strcpy(si->Buffer,"");
  488.      RefreshGList(KatalogGadgets[1],KatalogWnd,NULL,1L);
  489.      AuswahlT=0;
  490.      ZeigeTitel();
  491.     }
  492.   }
  493. }
  494.  
  495. void String2Clicked()
  496. {
  497.  register int                i;
  498.  register struct CNode      *node;
  499.  register struct TNode      *n;
  500.  register struct Katalog    *cat;
  501.  register struct StringInfo *si;
  502.  struct TagItem              tag[2];
  503.  
  504.  if(AuswahlK!=NULL)
  505.   {
  506.    node=Liste2.lh_Head;
  507.    for(i=0;i<AuswahlN;i++) node=node->Node.ln_Succ;
  508.    cat=node->Katalog;
  509.    si=KatalogGadgets[3]->SpecialInfo;
  510.    strcpy(&cat->CDName,si->Buffer);
  511.    node->Update=1;
  512.    tag[0].ti_Tag=GTLV_Labels;
  513.    tag[0].ti_Data=&Liste2;
  514.    tag[1].ti_Tag=TAG_DONE;
  515.    GTSetGadgetAttrsA(KatalogGadgets[2],KatalogWnd,NULL,&tag);
  516.    n=Liste1.lh_Head;
  517.    sprintf(&n->Titel,"%s:",&cat->CDName);
  518.    tag[0].ti_Tag=GTLV_Labels;
  519.    tag[0].ti_Data=&Liste1;
  520.    tag[1].ti_Tag=TAG_DONE;
  521.    GTSetGadgetAttrsA(KatalogGadgets[0],KatalogWnd,NULL,&tag);
  522.    ZeigeTitel();
  523.   }
  524. }
  525.  
  526. void AutoSave(item)
  527.  struct MenuItem *item;
  528. {
  529.  if(item->Flags & CHECKED) ASave=1; else ASave=0;
  530. }
  531.  
  532.  
  533. void main(argc,argv)
  534.  long   argc;
  535.  UBYTE *argv[];
  536. {
  537.  REGISTER ULONG              Signale;
  538.  REGISTER UBYTE             *name;
  539.  register int                i,test;
  540.  register struct DiskObject *di;
  541.  register struct WBArg      *wb;
  542.  
  543.  if(argc>1)
  544.   {
  545.    if(!(strcmp(argv[1],"?")))
  546.     {
  547.      printf("USAGE: %s [-q|QUIET -u|US -l|LOWRES -r|NOREQ\n",argv[0]);
  548.      puts("           -i|IGNORETOOLTYPES -f|FASTEXIT]");
  549.      exit(0);
  550.     }
  551.    for(test=1;test<argc;test++)
  552.     {
  553.      if(!(strcmp(argv[test],"-q"))) Quiet=TRUE;
  554.      if(!(strcmp(argv[test],"QUIET"))) Quiet=TRUE;
  555.      if(!(strcmp(argv[test],"-u"))) USModus=TRUE;
  556.      if(!(strcmp(argv[test],"US"))) USModus=TRUE;
  557.      if(!(strcmp(argv[test],"-l"))) LowRes=TRUE;
  558.      if(!(strcmp(argv[test],"LOWRES"))) LowRes=TRUE;
  559.      if(!(strcmp(argv[test],"-r"))) NoReq=TRUE;
  560.      if(!(strcmp(argv[test],"NOREQ"))) NoReq=TRUE;
  561.      if(!(strcmp(argv[test],"-i"))) NoTT=TRUE;
  562.      if(!(strcmp(argv[test],"IGNORETOOLTYPES"))) NoTT=TRUE;
  563.      if(!(strcmp(argv[test],"-f"))) FastExit=TRUE;
  564.      if(!(strcmp(argv[test],"FASTEXIT"))) FastExit=TRUE;
  565.     }
  566.   }
  567.  
  568.  if(argc==0)
  569.   {
  570.    wb=WBenchMsg->sm_ArgList;
  571.    name=wb->wa_Name;
  572.   }
  573.  else
  574.    name=argv[0];
  575.  
  576.  if(NoTT==FALSE)
  577.   {
  578.    IconBase=OpenLibrary("icon.library",0L);
  579.    if(IconBase!=NULL)
  580.     {
  581.      di=GetDiskObject(name);
  582.      if(di!=NULL)
  583.       {
  584.        name=FindToolType(di->do_ToolTypes,"QUIET");
  585.        if(name) if((MatchToolValue(name,"ON"))) Quiet=TRUE;
  586.        name=FindToolType(di->do_ToolTypes,"FASTEXIT");
  587.        if(name) if((MatchToolValue(name,"ON"))) FastExit=TRUE;
  588.        name=FindToolType(di->do_ToolTypes,"US");
  589.        if(name) if((MatchToolValue(name,"ON"))) USModus=TRUE;
  590.        name=FindToolType(di->do_ToolTypes,"LOWRES");
  591.        if(name) if((MatchToolValue(name,"ON"))) LowRes=TRUE;
  592.        FreeDiskObject(di);
  593.       }
  594.      CloseLibrary(IconBase);
  595.      IconBase=NULL;
  596.     }
  597.   }
  598.  
  599.  if(argc!=1)
  600.   {
  601.    if(argc>=5)
  602.     {
  603.      if( (!(strcmp(argv[1],"DISCID"))) && (!(strcmp(argv[3],"TITLE"))) )
  604.       {
  605.        sscanf(argv[2],"%lx",&ArgID);
  606.        ArgTitel=atol(argv[4]);
  607.       }
  608.      if(argc>5)
  609.       {
  610.        if(!(strcmp(argv[5],"QUIET"))) Quiet=TRUE;
  611.        else if(!(strcmp(argv[5],"LOWRES"))) LowRes=TRUE;
  612.        if(argc>6)
  613.          if(!(strcmp(argv[6],"LOWRES"))) LowRes=TRUE;
  614.       }
  615.     }
  616.   }
  617.  
  618.  OpenAll();
  619.  
  620.  IDCMPSignalMask=(1L<<KatalogWnd->UserPort->mp_SigBit);
  621.  do
  622.   {
  623.    Signale=Wait(IDCMPSignalMask+ControlSignalMask);
  624.    if(Signale & IDCMPSignalMask)
  625.      test=HandleKatalogIDCMP();
  626.  
  627.    if(Signale & ControlSignalMask)
  628.      if((ControlHandler())==1) test=2;
  629.  
  630.    if(test==2)
  631.     {
  632.      Iconify();
  633.      test=1;
  634.     }
  635.  
  636.   } while(test==1);
  637.  
  638.  KatalogeSichern();
  639.  CloseAll();
  640. }
  641.  
  642.  
  643. void Iconify()
  644. {
  645.  REGISTER ULONG Signale;
  646.  REGISTER BOOL  ende;
  647.  register int   test;
  648.  
  649.  AppItem=AddAppMenuItemA(0L,0L,"Music Box Archive",AppPort,NULL);
  650.  if(AppItem!=NULL)
  651.   {
  652.    AppIcon=AddAppIconA(1L,0L,"Music Box Archive",AppPort,0L,&MBArchiv,0L);
  653.    if(AppIcon!=NULL)
  654.     {
  655.      CloseKatalogWindow();
  656.      KatalogeSichern();
  657.      AuswahlK=NULL;
  658.      AuswahlT=AuswahlN=0;
  659.  
  660.      ende=FALSE;
  661.      while(ende==FALSE)
  662.       {
  663.        Signale=Wait(AppSignalMask+ControlSignalMask);
  664.        if(Signale & ControlSignalMask)
  665.          if((ControlHandler())==2) ende=TRUE;
  666.  
  667.        if(Signale & AppSignalMask)
  668.         {
  669.          WaitPort(AppPort);
  670.          ReplyMsg(GetMsg(AppPort));
  671.          ende=TRUE;
  672.         }
  673.       }
  674.  
  675.      test=OpenKatalogWindow();
  676.      if(test!=0)
  677.       {
  678.        RemoveAppIcon(AppIcon);
  679.        RemoveAppMenuItem(AppItem);
  680.        CloseAll();
  681.       }
  682.      RPort=KatalogWnd->RPort;
  683.      ox=KatalogWnd->BorderLeft;
  684.      oy=KatalogWnd->BorderTop;
  685.      ZeigePrefs();
  686.      if(ArgKNum!=0xFFFF)
  687.       {
  688.        Liste2Clicked(ArgKNum);
  689.        Liste1Clicked(ArgTitel);
  690.        ArgKNum=0xFFFF;
  691.       }
  692.  
  693.      ZeigeLogo();
  694.      ZeigeTitel();
  695.      RemoveAppIcon(AppIcon);
  696.     }
  697.    RemoveAppMenuItem(AppItem);
  698.    CleanUpPort(AppPort);
  699.   }
  700. }
  701.  
  702. /*
  703.    Stringvergleich für Sortierung:
  704.    =>  TRUE,  wenn String B vor A liegt
  705.        FALSE, wenn String A vor B liegt
  706. */
  707. BOOL CmpStrings(a,b)
  708.  UBYTE *a,*b;
  709. {
  710.  register int l1,l2,l,i;
  711.  
  712.  l1=strlen(a);
  713.  l2=strlen(b);
  714.  
  715.  if(l1>l2) l=l2; else l=l1;
  716.  
  717.  for(i=0;i<l;i++)
  718.   {
  719.    if(a[i]>b[i])
  720.      return(TRUE);
  721.    else if(b[i]>a[i])
  722.      return(FALSE);
  723.   }
  724.  if(l1>l2) return(TRUE);
  725.  return(FALSE);
  726. }
  727.  
  728. void LeseKatalog(name)
  729.  UBYTE *name;
  730. {
  731.  UBYTE                       path[40];
  732.  REGISTER ULONG              adr;
  733.  REGISTER UWORD              m,s,f,i;
  734.  register struct FileHandle *fh;
  735.  register struct Katalog    *cat;
  736.  register struct CNode      *node,*nach;
  737.  
  738.  sprintf(&path,"AudioCD:%s",name);
  739.  fh=Open(&path,MODE_OLDFILE);
  740.  if(fh!=NULL)
  741.   {
  742.    Katalog->Anzahl=99;
  743.    Read(fh,Katalog,KSIZE(Katalog));
  744.    Close(fh);
  745.    if((strncmp(&Katalog->ID,"DISC",4)))
  746.      return;
  747.  
  748.    if(Discs==0)
  749.     {
  750.      nach=NULL;
  751.     }
  752.    else
  753.     {
  754.      node=Liste2.lh_TailPred;
  755.      nach=NULL;
  756.      for(i=0;i<Discs;i++)
  757.       {
  758.        if((CmpStrings(node->Node.ln_Name,&Katalog->CDName))==FALSE)
  759.         {
  760.          /* Nodenname liegt vor CD-Name */
  761.          nach=node;
  762.          i=Discs;
  763.         }
  764.        node=node->Node.ln_Pred;
  765.       }
  766.     }
  767.  
  768.    Discs++;
  769.    Titel+=Katalog->Anzahl;
  770.    adr=Katalog->KE[Katalog->Anzahl-1].SAdresse+
  771.        Katalog->KE[Katalog->Anzahl-1].TAdresse;
  772.    m=(adr/75/60);
  773.    s=(adr/75) % 60;
  774.    f=(adr % 75);
  775.    Mins+=m;
  776.    Seks+=s;
  777.    Frames+=f;
  778.    cat=AllocRemember(&CatRemember,KSIZE(Katalog),MEMF_ANY);
  779.    if(cat!=NULL)
  780.     {
  781.      node=AllocRemember(&CatRemember,sizeof(struct CNode),MEMF_ANY|MEMF_CLEAR);
  782.      if(node!=NULL)
  783.       {
  784.        CopyMem(Katalog,cat,KSIZE(Katalog));
  785.        node->Node.ln_Name=&cat->CDName;
  786.        node->Katalog=cat;
  787.        node->Update=0;
  788.        if(nach==NULL)
  789.          AddHead(&Liste2,node);
  790.        else
  791.          Insert(&Liste2,node,nach);
  792.       }
  793.      else
  794.       {
  795.        Error(GS(6,"Not enough memory!"));
  796.        CloseAll();
  797.       }
  798.     }
  799.    else
  800.     {
  801.      Error(GS(6,"Not enough memory!"));
  802.      CloseAll();
  803.     }
  804.   }
  805. }
  806.  
  807. void LadeKataloge()
  808. {
  809.  register int           test,i;
  810.  register struct Lock  *lock;
  811.  register struct CNode *node;
  812.  struct FileInfoBlock   fib;
  813.  UBYTE                  buf[40];
  814.  
  815.  lock=Lock("AudioCD:",ACCESS_READ);
  816.  if(lock!=NULL)
  817.   {
  818.    ParsePattern("AudioCD-ID?????????",&buf,32);
  819.    Examine(lock,&fib);
  820.    do
  821.     {
  822.      test=ExNext(lock,&fib);
  823.      if(test==-1)
  824.       {
  825.        if((MatchPattern(&buf,&fib.fib_FileName))==TRUE)
  826.          LeseKatalog(&fib.fib_FileName);
  827.       }
  828.     } while(test==-1);
  829.    UnLock(lock);
  830.   }
  831.  else
  832.   {
  833.    Error(GS(42,"Unable to read directory AudioCD:"));
  834.    CloseAll();
  835.   }
  836.  if(Frames>74)
  837.   {
  838.    Seks+=(Frames / 75);
  839.    Frames=Frames % 75;
  840.   }
  841.  if(Seks>59)
  842.   {
  843.    Mins+=(Seks/60);
  844.    Seks=Seks % 60;
  845.   }
  846.  if(Mins>59)
  847.   {
  848.    Stds+=(Mins/60);
  849.    Mins=Mins % 60;
  850.   }
  851.  
  852.  if(ArgID!=0)
  853.   {
  854.    node=Liste2.lh_Head;
  855.    for(i=0;i<Discs;i++)
  856.     {
  857.      if(node->Katalog->DiscID==ArgID)
  858.       {
  859.        ArgKNum=i;
  860.        if(ArgTitel>node->Katalog->Anzahl) ArgTitel=node->Katalog->Anzahl;
  861.        i=Discs;
  862.       }
  863.      node=node->Node.ln_Succ;
  864.     }
  865.   }
  866. }
  867.  
  868. void SchreibeKatalog(k)
  869.  struct Katalog *k;
  870. {
  871.  UBYTE                      *ttArray[5];
  872.  UBYTE                       text[80];
  873.  register struct FileHandle *fh;
  874.  register struct DiskObject *di;
  875.  
  876.  sprintf(&text,"AudioCD:AudioCD-ID#%08lx",k->DiscID);
  877.  fh=Open(&text,MODE_NEWFILE);
  878.  if(fh!=NULL)
  879.   {
  880.    Write(fh,k,KSIZE(k));
  881.    Close(fh);
  882.    di=GetDiskObject(&text);
  883.    if(di!=NULL)
  884.     {
  885.      AudioCD.do_CurrentX=di->do_CurrentX;
  886.      AudioCD.do_CurrentY=di->do_CurrentY;
  887.      FreeDiskObject(di);
  888.     }
  889.    ttArray[0]=&k->CDName;
  890.    ttArray[1]="*** This file was created by";
  891.    ttArray[2]="*** MusicBox, written by";
  892.    ttArray[3]="*** Thomas Dreibholz";
  893.    ttArray[4]=NULL;
  894.    AudioCD.do_ToolTypes=&ttArray;
  895.    PutDiskObject(&text,&AudioCD);
  896.   }
  897.  else
  898.   Error(GS(41,"Error writing file!"));
  899. }
  900.  
  901.  
  902. void KatalogeSichern()
  903. {
  904.  UBYTE         as;
  905.  UBYTE         text[120];
  906.  struct CNode *node;
  907.  int           i,j;
  908.  
  909.  SleepPointer(KatalogWnd);
  910.  node=Liste2.lh_Head;
  911.  as=ASave;
  912.  for(i=0;i<Discs;i++)
  913.   {
  914.    if(node->Update==1)
  915.     {
  916.      if(as==0)
  917.       {
  918.        sprintf(&text,GS(43,"Do you want to save the catalog\n%s\n"),&node->Katalog->CDName);
  919.        ClearPointer(KatalogWnd);
  920.        j=MultiRequest(GS(44,"Save catalog..."),&text,GS(45,"Yes, save|Save all|No!"));
  921.        SleepPointer(KatalogWnd);
  922.        if(j==2)
  923.         {
  924.          j=1;
  925.          as=1;
  926.         }
  927.       }
  928.      else
  929.       j=1;
  930.  
  931.      if(j==1)
  932.       {
  933.        SchreibeKatalog(node->Katalog);
  934.        node->Update=0;
  935.       }
  936.     }
  937.    node=node->Node.ln_Succ;
  938.   }
  939.  ClearPointer(KatalogWnd);
  940. }
  941.  
  942. void PrefsSichern()
  943. {
  944.  register struct FileHandle *fh;
  945.  
  946.  SleepPointer(KatalogWnd);
  947.  fh=Open("S:MusicBoxArchive.config",MODE_NEWFILE);
  948.  if(fh!=NULL)
  949.   {
  950.    Write(fh,&ASave,1L);
  951.    Close(fh);
  952.   }
  953.  ClearPointer(KatalogWnd);
  954. }
  955.  
  956. void ZeigePrefs()
  957. {
  958.  register struct MenuItem *item;
  959.  
  960.  if(KatalogWnd!=NULL)
  961.   {
  962.    ClearMenuStrip(KatalogWnd);
  963.    item=KatalogMenus->NextMenu->FirstItem;
  964.    if(ASave!=0)
  965.      item->Flags |= CHECKED;
  966.    else
  967.      item->Flags &= (0xffff-CHECKED);
  968.    SetMenuStrip(KatalogWnd,KatalogMenus);
  969.   }
  970. }
  971.  
  972. void PrefsLaden()
  973. {
  974.  register struct FileHandle *fh;
  975.  
  976.  SleepPointer(KatalogWnd);
  977.  fh=Open("S:MusicBoxArchive.config",MODE_OLDFILE);
  978.  if(fh!=NULL)
  979.   {
  980.    Read(fh,&ASave,1L);
  981.    Close(fh);
  982.    ZeigePrefs();
  983.   }
  984.  ClearPointer(KatalogWnd);
  985. }
  986.  
  987. int ControlHandler()
  988. {
  989.  int                     iconify,i;
  990.  struct MusicBoxMessage *mbc;
  991.  struct CNode           *node;
  992.  
  993.  iconify=0;
  994.  mbc=GetMsg(ControlPort);
  995.  do
  996.   {
  997.    mbc->Status=MBCS_OK;
  998.    switch(mbc->Command)
  999.     {
  1000.      case MBC_ICONIFY:
  1001.        iconify=1;
  1002.       break;
  1003.      case MBC_UNICONIFY:
  1004.        iconify=2;
  1005.       break;
  1006.      case MBC_VERSION:
  1007.        mbc->Args[0]=VERSION;
  1008.       break;
  1009.      case 7000:
  1010.        if(KatalogWnd==NULL)
  1011.         {
  1012.          iconify=2;
  1013.          if(mbc->Args[0]!=0)
  1014.           {
  1015.            node=Liste2.lh_Head;
  1016.            for(i=0;i<Discs;i++)
  1017.             {
  1018.              if(node->Katalog->DiscID==mbc->Args[0])
  1019.               {
  1020.                ArgKNum=i;
  1021.                ArgTitel=mbc->Args[1];
  1022.                if(ArgTitel>node->Katalog->Anzahl) ArgTitel=node->Katalog->Anzahl;
  1023.                i=Discs;
  1024.               }
  1025.              node=node->Node.ln_Succ;
  1026.             }
  1027.           }
  1028.         }
  1029.        else
  1030.         {
  1031.          WindowToFront(KatalogWnd);
  1032.          ActivateWindow(KatalogWnd);
  1033.         }
  1034.       break;
  1035.     }
  1036.    ReplyMsg(mbc);
  1037.    mbc=GetMsg(ControlPort);
  1038.   } while(mbc!=NULL);
  1039.  return(iconify);
  1040. }
  1041.  
  1042.  
  1043. void ZeigeLogo()
  1044. {
  1045.  if(DisplayFont)
  1046.   {
  1047.    SetAPen(RPort,FARBE);
  1048.    SetFont(RPort,DisplayFont);
  1049.    PutText(595,222,"?");
  1050.    SetFont(RPort,TimesFont);
  1051.   }
  1052. }
  1053.  
  1054. void KatalogHilfe()
  1055. {
  1056.  register struct NewAmigaGuide *amg;
  1057.  struct FileLock               *lock;
  1058.  APTR                           ctx;
  1059.  UBYTE                          name[200];
  1060.  
  1061.  if(AmigaGuideBase!=NULL)
  1062.   {
  1063.    amg=AllocMem(sizeof(struct NewAmigaGuide),MEMF_CLEAR|MEMF_ANY);
  1064.    if(amg!=NULL)
  1065.     {
  1066.      amg->nag_Name="MusicBox:Archive.guide";
  1067.      SleepPointer(KatalogWnd);
  1068.      lock=NULL;
  1069.  
  1070.      if(Locale)
  1071.       {
  1072.        sprintf(&name,"MusicBox:%s/Archive.guide",Locale->loc_LanguageName);
  1073.        lock=Lock(&name,ACCESS_READ);
  1074.        if(lock!=NULL)
  1075.         {
  1076.          UnLock(lock);
  1077.          amg->nag_Name=&name;
  1078.         }
  1079.       }
  1080.  
  1081.      ctx=OpenAmigaGuide(amg,NULL);
  1082.      if(ctx!=NULL)
  1083.        CloseAmigaGuide(ctx);
  1084.      else
  1085.        Error(GS(79,"AmigaGuide is unable to load guide file!"));
  1086.  
  1087.      ClearPointer(KatalogWnd);
  1088.      FreeMem(amg,sizeof(struct NewAmigaGuide));
  1089.     }
  1090.    else
  1091.      Error(GS(6,"Not enough memory!"));
  1092.   }
  1093.  else
  1094.   Error(GS(78,"AmigaGuide is not available!"));
  1095. }
  1096.  
  1097. void Print()
  1098. {
  1099.  PrintIt(KatalogWnd,AuswahlK);
  1100. }
  1101.  
  1102. static struct NewGadget ong[4]=
  1103. {
  1104.  {10,28,580,150,0L,0L,0,0,0,0L},
  1105.  {10,178,580,18,0L,0L,10,PLACETEXT_IN,0,0L},
  1106.  {10,5,100,19,0L,0L,11,PLACETEXT_IN,0,0L},
  1107.  {110,5,480,19,0L,0L,11,0,0,0L}
  1108. };
  1109.  
  1110. void Suchen()
  1111. {
  1112.  struct NewGadget              ng[4];
  1113.  
  1114.  REGISTER BOOL                 ende;
  1115.  REGISTER ULONG                Class;
  1116.  UWORD                         Code;
  1117.  struct TagItem                tag[10];
  1118.  struct List                   Liste;
  1119.  struct Remember              *Remember;
  1120.  register struct Gadget       *IAddress;
  1121.  struct Screen                *scr;
  1122.  struct Gadget                *GadgetList,*g1,*g2,*g3,*g4;
  1123.  register int                  i;
  1124.  register long                 j;
  1125.  register struct Gadget       *gad;
  1126.  register struct Window       *win;
  1127.  register struct IntuiMessage *msg;
  1128.  struct VisualInfo            *vi;
  1129.  
  1130.  SleepPointer(KatalogWnd);
  1131.  NewList(&Liste);
  1132.  CopyMemQuick(&ong,&ng,4*sizeof(struct NewGadget));
  1133.  scr=LockPubScreen(NULL);
  1134.  if(scr!=NULL)
  1135.   {
  1136.    vi=GetVisualInfoA(scr,NULL);
  1137.    if(vi!=NULL)
  1138.     {
  1139.      for(i=0;i<4;i++)
  1140.       {
  1141.        ng[i].ng_VisualInfo=vi;
  1142.        ng[i].ng_TextAttr=&topaz11;
  1143.       }
  1144.      ng[1].ng_GadgetText=GS(57,"_Okay");
  1145.      ng[2].ng_GadgetText=GS(508,"_Find");
  1146.      if(LowRes==TRUE)
  1147.       {
  1148.        ng[0].ng_TopEdge-=2;
  1149.        for(i=1;i<4;i++)
  1150.          ng[i].ng_Height=15;
  1151.       }
  1152.      gad=CreateContext(&GadgetList);
  1153.      if(gad!=NULL)
  1154.       {
  1155.        Remember=NULL;
  1156.        tag[0].ti_Tag=GTLV_ReadOnly;
  1157.        tag[0].ti_Data=TRUE;
  1158.        tag[1].ti_Tag=GTLV_Labels;
  1159.        tag[1].ti_Data=&Liste;
  1160.        tag[2].ti_Tag=TAG_DONE;
  1161.        g1=CreateGadgetA(LISTVIEW_KIND,gad,&ng[0],&tag);
  1162.        if(g1!=NULL)
  1163.         {
  1164.          tag[0].ti_Tag=GT_Underscore;
  1165.          tag[0].ti_Data='_';
  1166.          tag[1].ti_Tag=TAG_DONE;
  1167.          g2=CreateGadgetA(BUTTON_KIND,g1,&ng[1],&tag);
  1168.          if(g2!=NULL)
  1169.           {
  1170.            g3=CreateGadgetA(BUTTON_KIND,g2,&ng[2],&tag);
  1171.            if(g3!=NULL)
  1172.             {
  1173.              tag[0].ti_Tag=GTSL_Max;
  1174.              tag[0].ti_Data=49;
  1175.              tag[1].ti_Tag=TAG_DONE;
  1176.              g4=CreateGadgetA(STRING_KIND,g3,&ng[3],&tag);
  1177.             }
  1178.           }
  1179.         }
  1180.       }
  1181.      if(g4!=NULL)
  1182.       {
  1183.        tag[0].ti_Tag=WA_Left;
  1184.        tag[0].ti_Data=20;
  1185.        tag[1].ti_Tag=WA_Top;
  1186.        tag[1].ti_Data=15;
  1187.        tag[2].ti_Tag=WA_InnerWidth;
  1188.        tag[2].ti_Data=600;
  1189.        tag[3].ti_Tag=WA_InnerHeight;
  1190.        if(LowRes==FALSE)
  1191.          tag[3].ti_Data=203;
  1192.        else
  1193.          tag[3].ti_Data=199;
  1194.        tag[4].ti_Tag=WA_IDCMP;
  1195.        tag[4].ti_Data=CLOSEWINDOW|LISTVIEWIDCMP|IDCMP_GADGETUP|VANILLAKEY;
  1196.        tag[5].ti_Tag=WA_Flags;
  1197.        tag[5].ti_Data=ACTIVATE|WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG|WFLG_GIMMEZEROZERO;
  1198.        tag[6].ti_Tag=WA_Gadgets;
  1199.        tag[6].ti_Data=GadgetList;
  1200.        tag[7].ti_Tag=WA_Title;
  1201.        tag[7].ti_Data=GS(509,"Search Title...");
  1202.        tag[8].ti_Tag=WA_PubScreen;
  1203.        tag[8].ti_Data=scr;
  1204.        tag[9].ti_Tag=TAG_DONE;
  1205.        win=OpenWindowTagList(NULL,&tag);
  1206.        if(win!=NULL)
  1207.         {
  1208.          GTRefreshWindow(win,NULL);
  1209.          ende=FALSE;
  1210.          while(ende==FALSE)
  1211.           {
  1212.            WaitPort(win->UserPort);
  1213.            msg=GTGetIMsg(win->UserPort);
  1214.            while(msg!=NULL)
  1215.             {
  1216.              Class=msg->Class;
  1217.              Code=msg->Code;
  1218.              IAddress=msg->IAddress;
  1219.              GTReplyIMsg(msg);
  1220.              switch(Class)
  1221.               {
  1222.                case CLOSEWINDOW:
  1223.                  ende=TRUE;
  1224.                 break;
  1225.                case GADGETUP:
  1226.                  gad=IAddress;
  1227.                  switch(gad->GadgetID)
  1228.                   {
  1229.                    case 10:
  1230.                      ende=TRUE;
  1231.                     break;
  1232.                    case 11:
  1233.                      SleepPointer(win);
  1234.                      NewList(&Liste);
  1235.                      if(Remember) FreeRemember(Remember,TRUE);
  1236.                      Remember=NULL;
  1237.                      Find(g4->SpecialInfo->Buffer,&Remember,&Liste);
  1238.                      tag[0].ti_Tag=GTLV_Labels;
  1239.                      tag[0].ti_Data=&Liste;
  1240.                      tag[1].ti_Tag=TAG_DONE;
  1241.                      GTSetGadgetAttrsA(g1,win,NULL,&tag);
  1242.                      ClearPointer(win);
  1243.                     break;
  1244.                   }
  1245.                  break;
  1246.                case VANILLAKEY:
  1247.                  switch(toupper((UBYTE)Code))
  1248.                   {
  1249.                    case 'O':
  1250.                    case 'S':
  1251.                      ende=TRUE;
  1252.                     break;
  1253.                    case 'U':
  1254.                    case 'F':
  1255.                      SleepPointer(win);
  1256.                      NewList(&Liste);
  1257.                      if(Remember) FreeRemember(Remember,TRUE);
  1258.                      Remember=NULL;
  1259.                      Find(g4->SpecialInfo->Buffer,&Remember,&Liste);
  1260.                      tag[0].ti_Tag=GTLV_Labels;
  1261.                      tag[0].ti_Data=&Liste;
  1262.                      tag[1].ti_Tag=TAG_DONE;
  1263.                      GTSetGadgetAttrsA(g1,win,NULL,&tag);
  1264.                      ClearPointer(win);
  1265.                     break;
  1266.                   }
  1267.                 break;
  1268.               }
  1269.              msg=GTGetIMsg(win->UserPort);
  1270.             }
  1271.           }
  1272.          if(Remember) FreeRemember(Remember,TRUE);
  1273.          CloseWindow(win);
  1274.         }
  1275.        else
  1276.          Error(GS(33,"Unable to open window!"));
  1277.        FreeGadgets(GadgetList);
  1278.       }
  1279.      else
  1280.        Error(GS(31,"Unable to create gadgets!"));
  1281.      FreeVisualInfo(vi);
  1282.     }
  1283.    else
  1284.      Error(GS(30,"Unable to get VisualInfo!"));
  1285.    UnlockPubScreen(NULL,scr);
  1286.   }
  1287.  else
  1288.    Error(GS(26,"Unable to lock public screen!"));
  1289.  ClearPointer(KatalogWnd);
  1290. }
  1291.  
  1292. void Find(pattern,rm,list)
  1293.  UBYTE       *pattern;
  1294.  APTR         rm;
  1295.  struct List *list;
  1296. {
  1297.  UBYTE                    buffer[60],
  1298.                           ucase[60];
  1299.  REGISTER BOOL            titel;
  1300.  register long            i,j;
  1301.  register UBYTE           k,*t;
  1302.  register struct CNode   *node;
  1303.  register struct Katalog *cat;
  1304.  register struct TNode   *xn;
  1305.  
  1306.  k=0;
  1307.  while(pattern[k]!=0x00)
  1308.   {
  1309.    ucase[k]=toupper(pattern[k]);
  1310.    k++;
  1311.   }
  1312.  ucase[k]=0x00;
  1313.  
  1314.  ParsePattern(&ucase,&buffer,60);
  1315.  node=Liste2.lh_Head;
  1316.  for(i=0;i<Discs;i++)
  1317.   {
  1318.    cat=node->Katalog;
  1319.    titel=FALSE;
  1320.    for(j=0;j<cat->Anzahl;j++)
  1321.     {
  1322.  
  1323.      t=&cat->KE[j].Titel;
  1324.      k=0;
  1325.      while(t[k]!=0x00)
  1326.       {
  1327.        ucase[k]=toupper(t[k]);
  1328.        k++;
  1329.       }
  1330.      ucase[k]=0x00;
  1331.  
  1332.      if((MatchPattern(&buffer,&ucase))==TRUE)
  1333.       {
  1334.        if(titel==FALSE)
  1335.         {
  1336.          xn=AllocRemember(rm,sizeof(struct TNode),MEMF_CLEAR|MEMF_ANY);
  1337.          if(xn!=NULL)
  1338.           {
  1339.            xn->Node.ln_Name=&xn->Titel,
  1340.            sprintf(&xn->Titel,"%s:",&cat->CDName);
  1341.            AddTail(list,xn);
  1342.           }
  1343.          else
  1344.           {
  1345.            Error(GS(510,"Not enough memory to continue!"));
  1346.            return;
  1347.           }
  1348.          titel=TRUE;
  1349.         }
  1350.        xn=AllocRemember(rm,sizeof(struct TNode),MEMF_CLEAR|MEMF_ANY);
  1351.        if(xn!=NULL)
  1352.         {
  1353.          xn->Node.ln_Name=&xn->Titel;
  1354.          sprintf(&xn->Titel,"   %02d  %s",j+1,&cat->KE[j].Titel);
  1355.          AddTail(list,xn);
  1356.         }
  1357.        else
  1358.         {
  1359.          Error(GS(510,"Not enough memory to continue!"));
  1360.          return;
  1361.         }
  1362.       }
  1363.     }
  1364.    if(titel==TRUE)
  1365.     {
  1366.      xn=AllocRemember(rm,sizeof(struct Node),MEMF_CLEAR|MEMF_ANY);
  1367.      xn->Node.ln_Name=&zero;
  1368.      AddTail(list,xn);
  1369.     }
  1370.    node=node->Node.ln_Succ;
  1371.   }
  1372. }
  1373.  
  1374.